/**
 * @param {number[][]} graph
 * @return {boolean}
 */
var isBipartite = function (graph) {
  let ok = true // 假定是二分图
  let n = graph.length // 得到节点的个数
  let color = new Array(n).fill(false) // 初始化所有的颜色都是false 因为是二分图 所以两个true和false就可以表示了
  let visited = new Array(n).fill(false) // 初始都没被访问过
  for (let i = 0; i < n; i++) {
    if (!visited[i]) { // 如果这个没有被访问过 就dfs这个下标的位置
      dfs(i)
    }
  }
  function dfs (v) { // 传入一个节点v
    if (!ok) return // 如果不是二分图 就直接return 
    visited[v] = true // 设置这个节点访问过了
    for (let w of graph[v]) {
      // 遍历相邻的节点
      if (!visited[w]) {
        // 如果相邻的节点没有访问过 那么就给这个节点的颜色设置成和v节点颜色不同
        color[w] = !color[v]
        dfs(w) // dfs去调用这个w节点
      } else {
        // 如果相同 就判断这个颜色是不是和v相同 如果相同 就让ok变成false
        if (color[w] === color[v]) {
          ok = false
          return
        }
        // 如果不同 就什么都不用干
      }
    }
  }
  return ok
}; 